package com.edu.exam.entity.grading.query;

import com.edu.exam.enums.grading.ConfigDataType;
import com.edu.exam.enums.grading.GradeQueryConfigType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩查询配置表实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_query_config</p>
 *
 * <p>成绩查询配置表实体用于存储成绩查询的配置信息，包含
 * 查询限制、缓存配置、导出配置、展示配置等。为成绩查询功能提供灵活的配置管理。</p>
 *
 * <p>核心功能：
 * - 查询限制：配置查询的各种限制条件
 * - 缓存管理：配置查询缓存的策略和参数
 * - 导出控制：配置数据导出的格式和限制
 * - 展示配置：配置查询结果的展示方式
 * - 性能优化：配置查询性能相关的参数</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeQueryConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 配置键值
     *
     * <p>配置的唯一键值标识。</p>
     */
    @Column(name = "config_key", nullable = false, unique = true, length = 100)
    private String configKey;

    /**
     * 配置值
     *
     * <p>配置的具体值，支持字符串、JSON等格式。</p>
     */
    @Lob
    @Column(name = "config_value", columnDefinition = "TEXT")
    private String configValue;

    /**
     * 配置类型
     *
     * <p>配置的类型标识。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "config_type", nullable = false, length = 30)
    private GradeQueryConfigType configType;

    /**
     * 配置描述
     *
     * <p>配置的详细描述信息。</p>
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * 是否系统配置
     *
     * <p>标记是否为系统级配置。</p>
     */
    @Column(name = "is_system", nullable = false)
    private Boolean isSystem = false;

    /**
     * 配置分组
     *
     * <p>配置的分组标识。</p>
     */
    @Column(name = "config_group", length = 50)
    private String configGroup;

    /**
     * 配置优先级
     *
     * <p>配置的优先级，数值越大优先级越高。</p>
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 配置状态
     *
     * <p>配置的启用状态。</p>
     */
    @Column(name = "config_status", nullable = false)
    private Boolean configStatus = true;

    /**
     * 数据类型
     *
     * <p>配置值的数据类型。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "data_type", length = 20)
    private ConfigDataType dataType = ConfigDataType.STRING;

    /**
     * 默认值
     *
     * <p>配置的默认值。</p>
     */
    @Column(name = "default_value", length = 1000)
    private String defaultValue;

    /**
     * 验证规则
     *
     * <p>配置值的验证规则，JSON格式存储。</p>
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    private String validationRules;

    /**
     * 取值范围
     *
     * <p>配置值的取值范围，JSON格式存储。</p>
     */
    @Column(name = "value_range", columnDefinition = "TEXT")
    private String valueRange;

    /**
     * 配置版本
     *
     * <p>配置的版本号。</p>
     */
    @Column(name = "config_version", length = 20)
    private String configVersion = "1.0";

    /**
     * 配置标签
     *
     * <p>配置的分类标签。</p>
     */
    @Column(name = "config_tags", length = 500)
    private String configTags;

    /**
     * 依赖配置
     *
     * <p>当前配置依赖的其他配置键值，JSON格式存储。</p>
     */
    @Column(name = "dependency_configs", columnDefinition = "TEXT")
    private String dependencyConfigs;

    /**
     * 影响范围
     *
     * <p>配置变更的影响范围，JSON格式存储。</p>
     */
    @Column(name = "impact_scope", columnDefinition = "TEXT")
    private String impactScope;

    /**
     * 环境限制
     *
     * <p>配置适用的环境限制。</p>
     */
    @Column(name = "environment_restriction", length = 100)
    private String environmentRestriction;

    /**
     * 用户限制
     *
     * <p>配置适用的用户限制，JSON格式存储。</p>
     */
    @Column(name = "user_restriction", columnDefinition = "TEXT")
    private String userRestriction;

    /**
     * 时间限制
     *
     * <p>配置的有效时间限制，JSON格式存储。</p>
     */
    @Column(name = "time_restriction", columnDefinition = "TEXT")
    private String timeRestriction;

    /**
     * 配置模板
     *
     * <p>配置的模板信息，JSON格式存储。</p>
     */
    @Column(name = "config_template", columnDefinition = "TEXT")
    private String configTemplate;

    /**
     * 配置示例
     *
     * <p>配置的使用示例。</p>
     */
    @Column(name = "config_example", columnDefinition = "TEXT")
    private String configExample;

    /**
     * 配置说明
     *
     * <p>配置的详细说明文档。</p>
     */
    @Column(name = "config_documentation", columnDefinition = "TEXT")
    private String configDocumentation;

    /**
     * 更新原因
     *
     * <p>配置更新的原因说明。</p>
     */
    @Column(name = "update_reason", length = 500)
    private String updateReason;

    /**
     * 重启要求
     *
     * <p>配置变更后是否需要重启应用。</p>
     */
    @Column(name = "restart_required", nullable = false)
    private Boolean restartRequired = false;

    /**
     * 缓存刷新要求
     *
     * <p>配置变更后是否需要刷新缓存。</p>
     */
    @Column(name = "cache_refresh_required", nullable = false)
    private Boolean cacheRefreshRequired = true;

    /**
     * 附加配置
     *
     * <p>附加的配置信息，JSON格式存储。</p>
     */
    @Column(name = "additional_config", columnDefinition = "TEXT")
    private String additionalConfig;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建人ID
     */
    @Column(name = "creator_id")
    private Long creatorId;

    /**
     * 更新人ID
     */
    @Column(name = "updater_id")
    private Long updaterId;
}